package com.example.yin.utils;


import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

public class Base64Utils {
    /**
     * 将网络图片进行base64编码
     * @param imageUrl 图片的 URL 地址
     * @return Base64 编码过的字节数组字符串，如果处理过程中出现异常则可能返回 null
     */
    public static String encodeImgageToBase64(URL imageUrl) {
        // 用于存储图片的字节数组输出流，初始化为 null
        ByteArrayOutputStream outputStream = null;
        try {
            // 从指定的 URL 读取图片，并将其解码为 BufferedImage 对象
            // BufferedImage 是 Java 中用于表示图像的类
            BufferedImage bufferedImage = ImageIO.read(imageUrl);
            // 创建一个新的字节数组输出流，用于存储图片的字节数据
            outputStream = new ByteArrayOutputStream();
            // 将 BufferedImage 对象以 JPEG 格式写入到字节数组输出流中
            // "jpg" 表示图片的格式为 JPEG
            ImageIO.write(bufferedImage, "jpg", outputStream);
        } catch (MalformedURLException e1) {
            // 当传入的 URL 格式不正确时，捕获该异常并打印堆栈跟踪信息
            e1.printStackTrace();
        } catch (IOException e) {
            // 当读取图片或写入字节数组输出流时出现 I/O 错误，捕获该异常并打印堆栈跟踪信息
            e.printStackTrace();
        }

        // 创建一个 Base64 编码器对象，用于对字节数组进行 Base64 编码
        // 注意：sun.misc.BASE64Encoder 在 Java 8 及以下版本可用，Java 11 及以上版本建议使用 java.util.Base64
        BASE64Encoder encoder = new BASE64Encoder();
        // 将字节数组输出流中的字节数据进行 Base64 编码，并返回编码后的字符串
        // outputStream.toByteArray() 方法将字节数组输出流中的数据转换为字节数组
        return encoder.encode(outputStream.toByteArray());
    }

    /**
     * 将本地图片进行Base64为编码
     * @param imageFile
     * @return
     */
    public static String encodeImageToBase64(File imageFile) {
        ByteArrayOutputStream outputStream=null;
        try{
            BufferedImage bufferedImage = ImageIO.read(imageFile);//图片文件数据对象
            outputStream=new ByteArrayOutputStream();
            ImageIO.write(bufferedImage,"jpg",outputStream);//bufferedImage以jpg格式写入outputStream

        }catch (MalformedURLException el){
            el.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }
        //对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        // 将字节数组输出流中的字节数据进行 Base64 编码，并返回编码后的字符串
        // outputStream.toByteArray() 方法将字节数组输出流中的数据转换为字节数组
        return encoder.encode(outputStream.toByteArray());
    }

    /**
     * 将64为编码的图片进行解码，并且保存到指定目录
     * @param base64
     * @param path
     * @param imgName
     */
    public static void decodeBase64ToImage(String base64,String path,String imgName){
        BASE64Decoder decoder = new BASE64Decoder();
        try{
            //创建一个BASE64Decoder对象，用于对Base64编码的字符串进行解码
            FileOutputStream write=new FileOutputStream(new File(path+"/"+imgName));
            // 解码，返回解码后的字节数组
            byte[] decoderbytes = decoder.decodeBuffer(base64);
            //将解码后的字节数组写入文件中
            write.write(decoderbytes);
            //关闭文件输出流，释放相关资源
            write.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
